#!/usr/bin/env python
# -*- coding: utf-8 -*-


#par: voltage:int类型，范围：0-5000，单位mV，例如：3000,代表3V,
#return: 返回要发给串口的Hex数据,数据格式:table，长度8
def fun_Send_VoltageControl(voltage):
    datas = ['01', '06', '00', '0A']
    #voltage = 3000 测试
    volH = voltage >> 8  # 获取voltage高8位
    volL = voltage & 0x00ff  # 获取voltage低8位
    volH_hex = hex(int(volH)).replace('0x', '').zfill(2)
    volL_hex = hex(int(volL)).replace('0x', '').zfill(2)
    datas.append(volH_hex.upper())
    datas.append(volL_hex.upper())
    #print(datas)
    # 输入数据后，打印一下列表
    crc16 = 0xFFFF
    poly = 0xA001
    for data in datas:
        # 表示将datas列表中的每一个变量赋值给data，
        # 在此你可以自由输入数据，校验的次数是由你输入的数据的多少决定的
        a = int(data, 16)
        # print(a)
        crc16 = a ^ crc16
        # ^ 异或运算：如果两个位为“异”（值不同），则该位结果为1，否则为0。
        for i in range(8):
            # 对于每一个data，都需要右移8次，可以简单理解为对每一位都完成了校验
            if 1 & (crc16) == 1:
                # crc16与上1 的结果(16位二进制)只有第0位是1或0，其他位都是0
                # & 与运算：都是1才是1，否则为0
                crc16 = crc16 >> 1
                # >>表示右移，即从高位向低位移出，最高位补0
                crc16 = crc16 ^ poly
            else:
                crc16 = crc16 >> 1
    # print(crc16)#得到的结果还是10进制
    crc16 = hex(int(crc16))  # 将10进制转换成16进制
    # print(crc16)
    crc16 = crc16[2:].upper()
    # [2:]的作用是将4位16进制的0x消除
    # .upper()可以让字母变成大写，只是为了格式好看而已，并不影响校验结果
    # print(crc16)
    length = len(crc16)
    high = crc16[0:length - 2].zfill(2)
    high = str(high)
    # [0:length]是将得到的4位16进制切片成两个校验码而已
    # 一些结果以0开头，会自动把0给吞掉 .zfill(2)可以让结果以两位二进制的形式出现
    low = crc16[length - 2:length].zfill(2)
    low = str(low)
    # print(type(low))
    crc16L = low.upper().zfill(2)
    crc16H = high.upper().zfill(2)
    # print("crcL:" + crc16L)
    # print("crcH:" + crc16H)
    datas.append(crc16L)
    datas.append(crc16H)
    return datas


if __name__ == '__main__':
    serialCommandData = fun_Send_VoltageControl(4000)
    print(serialCommandData)
    joint_str = " ".join(serialCommandData)
    print(joint_str)